#pragma once

#include <QByteArray>
#include <cstring>
#include <QString>

class Secure
{
public:
    static constexpr const char* BASE62_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    Secure(){}

    // 加密方法 - 整个报文（长度头+数据）异或加密
    static QByteArray encrypt(const QByteArray &data)
    {
        return xorEncryptDecrypt(data);
    }

    // 解密方法 - 整个报文异或解密
    static QByteArray decrypt(const QByteArray &data)
    {
        return xorEncryptDecrypt(data);
    }

// 内联方法：将数值编码为5位Base62字符串
    static inline QByteArray encodeLength(quint64 value)
    {
        QString result;

        // 转换为Base62（余数倒序）
        do
        {
            result.prepend(BASE62_CHARS[value % 62]);
            value /= 62;
        } while (value > 0);

        // 补前导零至5位
        while (result.length() < 5)
        {
            result.prepend('0');
        }

        return result.toUtf8();
    }

    // 内联方法：从5位Base62字符串解码为数值
   static inline quint64 decodeLength(const QByteArray& data)
   {
       if (data.size() != 5) return 0;

       quint64 result = 0;
       for (char c : data)
       {
           const char* pos = std::strchr(BASE62_CHARS, c);
           if (!pos) return 0; // 非法字符

           result = result * 62 + (pos - BASE62_CHARS);
       }

       return result;
   }
private:

    // 异或加密/解密（相同操作）
    static QByteArray xorEncryptDecrypt(const QByteArray &data)
    {
        return data;
    }
};
